using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Features
{
    /// <summary>
    /// <para>Bearing Distance To Line</para>
    /// <para>Creates a feature class containing geodetic line features constructed based on the values in an x-coordinate field, y-coordinate field, bearing field, and distance field of a table.</para>
    /// <para>创建一个要素类，其中包含根据表的 x 坐标字段、y 坐标字段、方位角字段和距离字段中的值构造的大地测量线要素。</para>
    /// </summary>    
    [DisplayName("Bearing Distance To Line")]
    public class BearingDistanceToLine : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public BearingDistanceToLine()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_table">
        /// <para>Input Table</para>
        /// <para>The input table. It can be a text file, CSV file, Excel file, dBASE table, or geodatabase table.</para>
        /// <para>输入表。它可以是文本文件、CSV 文件、Excel 文件、dBASE 表或地理数据库表。</para>
        /// </param>
        /// <param name="_out_featureclass">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing densified geodetic lines.</para>
        /// <para>包含致密大地测量线的输出要素类。</para>
        /// </param>
        /// <param name="_x_field">
        /// <para>X Field</para>
        /// <para>A numerical field in the input table containing the x-coordinates (or longitudes) of the starting points of lines to be positioned in the output coordinate system specified by the Spatial Reference parameter.</para>
        /// <para>输入表中的数值字段，其中包含要定位在空间参考参数指定的输出坐标系中的线起点的 x 坐标（或经度）。</para>
        /// </param>
        /// <param name="_y_field">
        /// <para>Y Field</para>
        /// <para>A numerical field in the input table containing the y-coordinates (or latitudes) of the starting points of lines to be positioned in the output coordinate system specified by the Spatial Reference parameter.</para>
        /// <para>输入表中的数值字段，其中包含要定位在空间参考参数指定的输出坐标系中的线起点的 y 坐标（或纬度）。</para>
        /// </param>
        /// <param name="_distance_field">
        /// <para>Distance Field</para>
        /// <para>A numerical field in the input table containing the distances from the starting points for creating the output lines.</para>
        /// <para>输入表中的数值字段，其中包含与起点之间的距离，用于创建输出线。</para>
        /// </param>
        /// <param name="_distance_units">
        /// <para>Distance Units</para>
        /// <para><xdoc>
        ///   <para>Specifies the units that will be used for the Distance Field parameter.</para>
        ///   <bulletList>
        ///     <bullet_item>Meters—The units will be meters.</bullet_item><para/>
        ///     <bullet_item>Kilometers—The units will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Miles—The units will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical miles—The units will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Feet—The units will be feet.</bullet_item><para/>
        ///     <bullet_item>U.S. survey feet—The units will be U.S. survey feet.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于“距离字段”参数的单位。</para>
        ///   <bulletList>
        ///     <bullet_item>米—单位为米。</bullet_item><para/>
        ///     <bullet_item>千米—单位将为千米。</bullet_item><para/>
        ///     <bullet_item>英里—单位为英里。</bullet_item><para/>
        ///     <bullet_item>海里—单位为海里。</bullet_item><para/>
        ///     <bullet_item>英尺—单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>美国测量英尺—单位为美国测量英尺。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_bearing_field">
        /// <para>Bearing Field</para>
        /// <para>A numerical field in the input table containing bearing angle values for the output line rotation. The angles are measured clockwise from north.</para>
        /// <para>输入表中的数值字段，包含输出线旋转的方位角值。角度是从北顺时针方向测量的。</para>
        /// </param>
        /// <param name="_bearing_units">
        /// <para>Bearing Units</para>
        /// <para><xdoc>
        ///   <para>Specifies the units of the Bearing Field parameter values.</para>
        ///   <bulletList>
        ///     <bullet_item>Decimal degrees— The units will be decimal degrees. This is the default.</bullet_item><para/>
        ///     <bullet_item>Mils—The units will be mils.</bullet_item><para/>
        ///     <bullet_item>Radians—The units will be radians.</bullet_item><para/>
        ///     <bullet_item>Gradians—The units will be gradians.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定“轴承场”（Bearing Field） 参数值的单位。</para>
        ///   <bulletList>
        ///     <bullet_item>十进制度— 单位为十进制度。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>密耳—单位将为密耳。</bullet_item><para/>
        ///     <bullet_item>弧度—单位为弧度。</bullet_item><para/>
        ///     <bullet_item>Gradians—单位将为 gradians。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public BearingDistanceToLine(object _in_table, object _out_featureclass, object _x_field, object _y_field, object _distance_field, _distance_units_value _distance_units, object _bearing_field, _bearing_units_value _bearing_units)
        {
            this._in_table = _in_table;
            this._out_featureclass = _out_featureclass;
            this._x_field = _x_field;
            this._y_field = _y_field;
            this._distance_field = _distance_field;
            this._distance_units = _distance_units;
            this._bearing_field = _bearing_field;
            this._bearing_units = _bearing_units;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Bearing Distance To Line";

        public override string CallName => "management.BearingDistanceToLine";

        public override List<string> AcceptEnvironments => ["scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_table, _out_featureclass, _x_field, _y_field, _distance_field, _distance_units.GetGPValue(), _bearing_field, _bearing_units.GetGPValue(), _line_type.GetGPValue(), _id_field, _spatial_reference, _attributes.GetGPValue()];

        /// <summary>
        /// <para>Input Table</para>
        /// <para>The input table. It can be a text file, CSV file, Excel file, dBASE table, or geodatabase table.</para>
        /// <para>输入表。它可以是文本文件、CSV 文件、Excel 文件、dBASE 表或地理数据库表。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Table")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_table { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing densified geodetic lines.</para>
        /// <para>包含致密大地测量线的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_featureclass { get; set; }


        /// <summary>
        /// <para>X Field</para>
        /// <para>A numerical field in the input table containing the x-coordinates (or longitudes) of the starting points of lines to be positioned in the output coordinate system specified by the Spatial Reference parameter.</para>
        /// <para>输入表中的数值字段，其中包含要定位在空间参考参数指定的输出坐标系中的线起点的 x 坐标（或经度）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("X Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _x_field { get; set; }


        /// <summary>
        /// <para>Y Field</para>
        /// <para>A numerical field in the input table containing the y-coordinates (or latitudes) of the starting points of lines to be positioned in the output coordinate system specified by the Spatial Reference parameter.</para>
        /// <para>输入表中的数值字段，其中包含要定位在空间参考参数指定的输出坐标系中的线起点的 y 坐标（或纬度）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Y Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _y_field { get; set; }


        /// <summary>
        /// <para>Distance Field</para>
        /// <para>A numerical field in the input table containing the distances from the starting points for creating the output lines.</para>
        /// <para>输入表中的数值字段，其中包含与起点之间的距离，用于创建输出线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _distance_field { get; set; }


        /// <summary>
        /// <para>Distance Units</para>
        /// <para><xdoc>
        ///   <para>Specifies the units that will be used for the Distance Field parameter.</para>
        ///   <bulletList>
        ///     <bullet_item>Meters—The units will be meters.</bullet_item><para/>
        ///     <bullet_item>Kilometers—The units will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Miles—The units will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical miles—The units will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Feet—The units will be feet.</bullet_item><para/>
        ///     <bullet_item>U.S. survey feet—The units will be U.S. survey feet.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于“距离字段”参数的单位。</para>
        ///   <bulletList>
        ///     <bullet_item>米—单位为米。</bullet_item><para/>
        ///     <bullet_item>千米—单位将为千米。</bullet_item><para/>
        ///     <bullet_item>英里—单位为英里。</bullet_item><para/>
        ///     <bullet_item>海里—单位为海里。</bullet_item><para/>
        ///     <bullet_item>英尺—单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>美国测量英尺—单位为美国测量英尺。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance Units")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _distance_units_value _distance_units { get; set; }

        public enum _distance_units_value
        {
            /// <summary>
            /// <para>Meters</para>
            /// <para>Meters—The units will be meters.</para>
            /// <para>米—单位为米。</para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("METERS")]
            _METERS,

            /// <summary>
            /// <para>Kilometers</para>
            /// <para>Kilometers—The units will be kilometers.</para>
            /// <para>千米—单位将为千米。</para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("KILOMETERS")]
            _KILOMETERS,

            /// <summary>
            /// <para>Miles</para>
            /// <para>Miles—The units will be miles.</para>
            /// <para>英里—单位为英里。</para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("MILES")]
            _MILES,

            /// <summary>
            /// <para>Nautical miles</para>
            /// <para>Nautical miles—The units will be nautical miles.</para>
            /// <para>海里—单位为海里。</para>
            /// </summary>
            [Description("Nautical miles")]
            [GPEnumValue("NAUTICAL_MILES")]
            _NAUTICAL_MILES,

            /// <summary>
            /// <para>Feet</para>
            /// <para>Feet—The units will be feet.</para>
            /// <para>英尺—单位将为英尺。</para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("FEET")]
            _FEET,

            /// <summary>
            /// <para>U.S. survey feet</para>
            /// <para>U.S. survey feet—The units will be U.S. survey feet.</para>
            /// <para>美国测量英尺—单位为美国测量英尺。</para>
            /// </summary>
            [Description("U.S. survey feet")]
            [GPEnumValue("US_SURVEY_FEET")]
            _US_SURVEY_FEET,

        }

        /// <summary>
        /// <para>Bearing Field</para>
        /// <para>A numerical field in the input table containing bearing angle values for the output line rotation. The angles are measured clockwise from north.</para>
        /// <para>输入表中的数值字段，包含输出线旋转的方位角值。角度是从北顺时针方向测量的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Bearing Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _bearing_field { get; set; }


        /// <summary>
        /// <para>Bearing Units</para>
        /// <para><xdoc>
        ///   <para>Specifies the units of the Bearing Field parameter values.</para>
        ///   <bulletList>
        ///     <bullet_item>Decimal degrees— The units will be decimal degrees. This is the default.</bullet_item><para/>
        ///     <bullet_item>Mils—The units will be mils.</bullet_item><para/>
        ///     <bullet_item>Radians—The units will be radians.</bullet_item><para/>
        ///     <bullet_item>Gradians—The units will be gradians.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定“轴承场”（Bearing Field） 参数值的单位。</para>
        ///   <bulletList>
        ///     <bullet_item>十进制度— 单位为十进制度。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>密耳—单位将为密耳。</bullet_item><para/>
        ///     <bullet_item>弧度—单位为弧度。</bullet_item><para/>
        ///     <bullet_item>Gradians—单位将为 gradians。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Bearing Units")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _bearing_units_value _bearing_units { get; set; }

        public enum _bearing_units_value
        {
            /// <summary>
            /// <para>Decimal degrees</para>
            /// <para>Decimal degrees— The units will be decimal degrees. This is the default.</para>
            /// <para>十进制度— 单位为十进制度。这是默认设置。</para>
            /// </summary>
            [Description("Decimal degrees")]
            [GPEnumValue("DEGREES")]
            _DEGREES,

            /// <summary>
            /// <para>Mils</para>
            /// <para>Mils—The units will be mils.</para>
            /// <para>密耳—单位将为密耳。</para>
            /// </summary>
            [Description("Mils")]
            [GPEnumValue("MILS")]
            _MILS,

            /// <summary>
            /// <para>Radians</para>
            /// <para>Radians—The units will be radians.</para>
            /// <para>弧度—单位为弧度。</para>
            /// </summary>
            [Description("Radians")]
            [GPEnumValue("RADS")]
            _RADS,

            /// <summary>
            /// <para>Gradians</para>
            /// <para>Gradians—The units will be gradians.</para>
            /// <para>Gradians—单位将为 gradians。</para>
            /// </summary>
            [Description("Gradians")]
            [GPEnumValue("GRADS")]
            _GRADS,

        }

        /// <summary>
        /// <para>Line Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of geodetic line to construct.</para>
        ///   <bulletList>
        ///     <bullet_item>Geodesic— A type of geodetic line that most accurately represents the shortest distance between any two points on the surface of the earth will be constructed. The mathematical definition of the geodesic line is quite lengthy and complex and is therefore omitted here. This is the default.</bullet_item><para/>
        ///     <bullet_item>Great circle—A type of geodetic line that represents the path between any two points along the intersection of the surface of the earth and a plane that passes through the center of the earth will be constructed. Depending on the output coordinate system specified by the Spatial Reference parameter, in a spheroid-based coordinate system, the line is a great elliptic; in a sphere-based coordinate system, the line is uniquely called a great circle—a circle of the largest radius on the spherical surface.</bullet_item><para/>
        ///     <bullet_item>Rhumb line—A type of geodetic line, also known as a loxodrome line, that represents a path between any two points on the surface of a spheroid defined by a constant azimuth from a pole will be constructed. A rhumb line is shown as a straight line in the Mercator projection.</bullet_item><para/>
        ///     <bullet_item>Normal section—A type of geodetic line that represents a path between any two points on the surface of a spheroid defined by the intersection of the spheroid surface and a plane that passes through the two points and is normal (perpendicular) to the spheroid surface at the starting point of the two points will be constructed. Therefore, the normal section line from point A to point B is different from the one from point B to point A.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要构造的大地测量线的类型。</para>
        ///   <bulletList>
        ///     <bullet_item>测地线 — 将构建一种最准确地表示地球表面任意两点之间最短距离的大地测量线。测地线的数学定义相当冗长和复杂，因此此处省略。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>大圆 - 一种大地测量线，表示沿地球表面交点的任意两点之间的路径，将构建穿过地球中心的平面。根据空间参考参数指定的输出坐标系，在基于椭球体的坐标系中，直线为大椭圆;在基于球体的坐标系中，直线被唯一地称为大圆，即球面上半径最大的圆。</bullet_item><para/>
        ///     <bullet_item>隆线 - 将构造一种大地测量线，也称为 loxodrome 线，表示将构建的椭球体表面上任意两点之间的路径，该点由极点的恒定方位角定义。菱形线在墨卡托投影中显示为直线。</bullet_item><para/>
        ///     <bullet_item>法线截面 - 一种大地测量线，表示由椭球体表面的交点定义的球体表面上任意两点之间的路径，该平面穿过两点且在两点起点处垂直（垂直于）椭球体表面。因此，从 A 点到 B 点的法线与从 B 点到 A 点的法线不同。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Line Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _line_type_value _line_type { get; set; } = _line_type_value._GEODESIC;

        public enum _line_type_value
        {
            /// <summary>
            /// <para>Geodesic</para>
            /// <para>Geodesic— A type of geodetic line that most accurately represents the shortest distance between any two points on the surface of the earth will be constructed. The mathematical definition of the geodesic line is quite lengthy and complex and is therefore omitted here. This is the default.</para>
            /// <para>测地线 — 将构建一种最准确地表示地球表面任意两点之间最短距离的大地测量线。测地线的数学定义相当冗长和复杂，因此此处省略。这是默认设置。</para>
            /// </summary>
            [Description("Geodesic")]
            [GPEnumValue("GEODESIC")]
            _GEODESIC,

            /// <summary>
            /// <para>Great circle</para>
            /// <para>Great circle—A type of geodetic line that represents the path between any two points along the intersection of the surface of the earth and a plane that passes through the center of the earth will be constructed. Depending on the output coordinate system specified by the Spatial Reference parameter, in a spheroid-based coordinate system, the line is a great elliptic; in a sphere-based coordinate system, the line is uniquely called a great circle—a circle of the largest radius on the spherical surface.</para>
            /// <para>大圆 - 一种大地测量线，表示沿地球表面交点的任意两点之间的路径，将构建穿过地球中心的平面。根据空间参考参数指定的输出坐标系，在基于椭球体的坐标系中，直线为大椭圆;在基于球体的坐标系中，直线被唯一地称为大圆，即球面上半径最大的圆。</para>
            /// </summary>
            [Description("Great circle")]
            [GPEnumValue("GREAT_CIRCLE")]
            _GREAT_CIRCLE,

            /// <summary>
            /// <para>Rhumb line</para>
            /// <para>Rhumb line—A type of geodetic line, also known as a loxodrome line, that represents a path between any two points on the surface of a spheroid defined by a constant azimuth from a pole will be constructed. A rhumb line is shown as a straight line in the Mercator projection.</para>
            /// <para>隆线 - 将构造一种大地测量线，也称为 loxodrome 线，表示将构建的椭球体表面上任意两点之间的路径，该点由极点的恒定方位角定义。菱形线在墨卡托投影中显示为直线。</para>
            /// </summary>
            [Description("Rhumb line")]
            [GPEnumValue("RHUMB_LINE")]
            _RHUMB_LINE,

            /// <summary>
            /// <para>Normal section</para>
            /// <para>Normal section—A type of geodetic line that represents a path between any two points on the surface of a spheroid defined by the intersection of the spheroid surface and a plane that passes through the two points and is normal (perpendicular) to the spheroid surface at the starting point of the two points will be constructed. Therefore, the normal section line from point A to point B is different from the one from point B to point A.</para>
            /// <para>法线截面 - 一种大地测量线，表示由椭球体表面的交点定义的球体表面上任意两点之间的路径，该平面穿过两点且在两点起点处垂直（垂直于）椭球体表面。因此，从 A 点到 B 点的法线与从 B 点到 A 点的法线不同。</para>
            /// </summary>
            [Description("Normal section")]
            [GPEnumValue("NORMAL_SECTION")]
            _NORMAL_SECTION,

        }

        /// <summary>
        /// <para>ID</para>
        /// <para>A field in the input table. This field and the values are included in the output and can be used to join the output features with the records in the input table.</para>
        /// <para>输入表中的字段。此字段和值包含在输出中，可用于将输出要素与输入表中的记录连接起来。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("ID")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _id_field { get; set; } = null;


        /// <summary>
        /// <para>Spatial Reference</para>
        /// <para>The spatial reference of the output feature class. The default is GCS_WGS_1984 or the input coordinate system if it is not Unknown.</para>
        /// <para>输出要素类的空间参考。默认值为 GCS_WGS_1984 或输入坐标系（如果它不是未知）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Spatial Reference")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _spatial_reference { get; set; } = null;


        /// <summary>
        /// <para>Preserve attributes</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the remaining input fields will be written to the output feature class.</para>
        ///   <para>
        ///     <bulletList>
        ///       <bullet_item>Unchecked—The remaining input fields will not be written to the output feature class. This is the default.</bullet_item><para/>
        ///       <bullet_item>Checked—The remaining input fields will be included in the output feature class. A new field, ORIG_FID, will also be added to the output feature class to store the input feature ID values.</bullet_item><para/>
        ///     </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否将剩余输入字段写入输出要素类。</para>
        ///   <para>
        ///     <bulletList>
        ///       <bullet_item>未选中 - 其余输入字段不会写入输出要素类。这是默认设置。</bullet_item><para/>
        ///       <bullet_item>选中 - 其余输入字段将包含在输出要素类中。新字段 ORIG_FID 也将添加到输出要素类中，用于存储输入要素 ID 值。</bullet_item><para/>
        ///     </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Preserve attributes")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _attributes_value _attributes { get; set; } = _attributes_value._false;

        public enum _attributes_value
        {
            /// <summary>
            /// <para>ATTRIBUTES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ATTRIBUTES")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_ATTRIBUTES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_ATTRIBUTES")]
            [GPEnumValue("false")]
            _false,

        }

        public BearingDistanceToLine SetEnv(object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}